#ifndef HAAR_CLASSIFIER_H_
#define HAAR_CLASSIFIER_H_

#include "ZMLAlgorithm.h"
#include "ImageLoader.h"

GLOBAL_NAMESPACE_BEGIN
NAMESPACE_MACHINE_LEARNING_BEGIN

class HaarClassiferParams;

enum HaarClassiferType
{
    HAAR_2_RECT_FEATURE = 0,
    HAAR_3_RECT_FEATURE,
    HAAR_4_RECT_FEATURE
};

class HaarClassifier
{
public:
    HaarClassifier();
    ~HaarClassifier();

    // training
    int     train(const Eigen::MatrixXd& trainData, const Eigen::VectorXi& labels, const Eigen::MatrixXd& weights);
    double  evalError(const Eigen::MatrixXd& data, const Eigen::VectorXi& labels, const Eigen::MatrixXd& weights);

    // predict
    int     predict(const Eigen::RowVectorXd& oneData) const;
    double  evaluate(const Eigen::RowVectorXd& oneData, int classIdx) const;
    double  evaluate(const Eigen::MatrixXd& data, int dataIdx, int classIdx) const;
    //int     getLabelResponse(int label);

    int train(const ImageLoader* images, const Eigen::MatrixXi& labels, const Eigen::MatrixXd& weights);

private:
    std::auto_ptr<HaarClassiferParams> params_;
};

NAMESPACE_MACHINE_LEARNING_END
GLOBAL_NAMESPACE_END

#endif//HAAR_CLASSIFIER_H_